#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

/* 第1步自定义单向链表结构
 * 1、定义存储数据的结构体
 * 2、定义虚拟头节点的结构体 */

typedef struct Node
{
	int data;//存储链表的数据
	struct Node *next;//指向下一个节点（元素）的指针
}Node;

typedef struct
{
	size_t size;//记录单向链表中存储的数据个数
	Node *head;//链表头节点指针
}LinkedList;

/* 第2步定义链表操作函数
 * 1、初始化链表
 * 2、返回链表长度
 * 3、在指定位置插入元素--增
 * 4、在末尾插入元素
 * 5、删除指定位置的元素并返回被删除的元素--删
 * 6、删除末尾元素
 * 7、修改链表元素--改
 * 8、获取指定位置的元素--查
 * 9、打印链表所有元素
 * 10、释放链表内存 */

/*1、初始化链表*/
void initLinkedList(LinkedList *list);
/*2、返回链表的长度*/
size_t getLength(const LinkedList *list);
/*3、在指定位置插入元素*/
void insertAt(LinkedList *list, size_t index, int element);
/*4、在末尾插入元素*/
void insertEnd(LinkedList *list, int element);
/*5、删除指定位置的元素并返回被删除的元素*/
int deleteAt(LinkedList *list, size_t index);
/*6、删除末尾元素*/
int deleteEnd(LinkedList *list);
/*7、修改指定位置的元素*/
void modifyAt(const LinkedList *list, size_t index, int newValue);
/*8、获取指定位置的元素*/
int getElementAt(const LinkedList *list, size_t index);
/*9、遍历链表中所有元素*/
void printAt(LinkedList *list);
/*10、释放链表内存*/
void destroyLinkedList(LinkedList *list);